<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title>Sucha's Blog - Archive for October, 2020</title>
    <meta name="generator" content="MarkdownProjectCompositor.lua">
    <meta name="author" content="Sucha">
    <meta name="keywords" content="suchang, programming, Linux, Lua">
    <meta name="description" content="Sucha's blog">
    <link rel="shortcut icon" href="../images/ico.png">
    <link rel="stylesheet" type="text/css" href="../styles/blog.css">
    <link rel="stylesheet" type="text/css" href="../styles/prism.min.css">
    <style id="site_theme"></style>
  </head>
  <body>
    <div id="body">
      <div id="text">
	   <!-- Page published by cmark-gfm begins here --><h1>Sucha's Blog ~ Archive for October, 2020</h1>
<p><a id="p2"></a></p>
<div class="date">20年10月26日 周一 22:48</div>
<h2>《在故宫寻找苏东坡》</h2>
<p>一直很喜欢苏东坡的词，不记得在哪里看到了推荐，就买了这本书。</p>
<p>这本书随着苏东坡的一生展开，考取功名、入仕、被贬，然后其诗词的变化，心境的变化，所写词在当时心境的解读等等。</p>
<p>考取功名、入仕在前面几章，不表。</p>
<p>被贬是因为文字狱，经历了生死，但苏东坡并未因此颓废不堪，像陶渊明一样淡泊修仙，远离尘世，相反他一直在入世，只是不再朝中爭功名了（精神小伙爭儒家正统）。</p>
<p>被贬到黄州后，俸禄不够养活全家，不得不把自己当成农民，在县城东边买了一块地自给自足，并自称东坡居士。种植、收成、酿酒，看到黄州人民不爱吃猪肉，猪肉很便宜，又自创了东坡肉。这一切充满了泥土间的汗水、快乐，满是人世的酸甜，虽然消瘦了许多，但却是脚踏实地的。</p>
<p>随着王安石新政停摆（老皇帝驾崩），新皇帝又将苏东坡等老臣请上了朝，但是快乐很短暂，很快又因为写诗词的影响被贬。</p>
<p>即便如此，短暂的就职，也给杭州留下了疏通后的西湖，淤泥堆成了白堤。然后是一路向南的贬职，最远到了海南岛。当时海南岛都还是原住民，以当时的条件，过了海就当成是半个死囚了，当时那边连书都没有，这是他最痛苦的地方。</p>
<p>书籍里面对于苏东坡诗词画的介绍，结合当时环境、心境的分析太细腻了，我表达不出来，对比在其时代之前相同的主题，认为其自创了一派，在表达，艺术以及美的结合上，大大拓展了延伸的范围。</p>
<p>最悲哀的是，作者认为诗、词的顶峰在千年以前，自从苏东坡之后，就没有诗、词的达人了，至少没有那种高度的。</p>
<div class="category"><a href="CategoryReading.html">CategoryReading</a> / <a href="2020-10.html#p2">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<p><a id="p1"></a></p>
<div class="date">20年10月21日 周三 20:51</div>
<h2>ffi_gccload 在 Lua 中动态加载 C Source</h2>
<p>不晓得从哪里搜到了这个库 <a href="https://github.com/javierguerragiraldez/lua-tcc">lua-tcc</a>，可以在 Lua 运行期间，通过 one pass 的 TCC 动态加载 C 代码，让 Lua 的控制可以更深入底层，甚至可以在 Lua 中进行 C 的编程。</p>
<p>可惜这个项目距离久远，TCC 在 MacOS 下面编译也成问题，意味着通用性欠佳，挺可惜的。不过有了这个想法后，想着不通过 TCC，用 GCC、Clang 其实也可以的嘛，于是就有了 <a href="https://github.com/lalawue/ffi_gccload">ffi_gccload</a>。</p>
<p>流程变成了这样，将 C Source String 导入到一个源文件里面，通过 GCC 编译得到动态库，使用 ffi.load() 加载进来，并通过 ffi.cdef 声明接口，就可以使用了。</p>
<p>其实就是将 C 的编译、链接过程给固定了就好，如下的代码：</p>
<pre><code class="language-lua">local config = require(&quot;ffi_gccload&quot;).new()

-- like ffi.cdef
config:addSourceDef([[
    int print_name(void);
    int add_num(int a, int b); 
]])
local p = config:loadSourceString([[
#include &lt;stdio.h&gt;
int print_name(void) {
    printf(&quot;Hello, world\n&quot;);
    return 0;
}
int add_num(int a, int b) {
    return a * 2 + b;
}
]])
if p then
    p.print_name()
    local a, b = ...
    a, b = a and tonumber(a) or 0, b and tonumber(b) or 0
    print(&quot;result&quot;, p.add_num(a, b))
else
    print(&quot;failed to load&quot;)
end
</code></pre>
<p>生成一个动态编译配置，会输出</p>
<pre><code class="language-lua">$ lua test.lua 2 3
Hello, world
result  7
</code></pre>
<p>其实是将编译产生的中间 .so 放在临时目录，加载后其实就可以删除掉这个 so 了，这在 MacOS 以及 Linux 应该都是可以的。</p>
<p>上面生成的动态编译配置，其实可以加入 include、libary 的 path 以及 lib name，已经越来越像一个 build 系统了，其实就是类似的。</p>
<p>有了上面这套，虽然相比 TCC 速度慢一点（毕竟 TCC 是 one pass 就出成果的），但是胜在兼容性号，修改一下后，估计 Windows 下面也是能跑的。</p>
<p>往后可以在服务端拿到 C 代码，捣鼓以下就能用到客户端上面了，或者一些少量使用 C 操作更方面的逻辑，结合放在 Lua 中作为源代码发布出去，使用的时候，先编译加载动态库，也是一个方案。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2020-10.html#p1">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<p><a id="p0"></a></p>
<div class="date">20年10月11日 周二 02:12</div>
<h2>DNS service 重构</h2>
<p>将 rpc_framework 中 <a href="https://github.com/lalawue/rpc_framework/tree/master/apps/service_dns">service_dns</a> 网络层的控制从 C 层移到了 Lua 层，C 层只负责 UDP 包的数据拼接、解包，将代码统一到了 <a href="https://github.com/lalawue/m_dnsutils">m_dnsutils</a> 里。</p>
<p>在减少了大量 C 跟 Lua 的交互后，两者算是各自做了自己擅长的方面，自测后的效果也不错。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2020-10.html#p0">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- Page published by cmark-gfm ends here -->
  <div id="foot">2004-<script>var d = new
	Date();document.write(d.getFullYear())</script> &copy;
	Sucha. Powered by MarkdownProjectCompositor.
  </div>
  </div><!-- text -->
  <div id="sidebar">
  </div><!-- sidebar -->
  <script src="../js/prism.min.js" async="async"></script>
  <script src="../js/blog_sidebar.js"></script>
  </div> <!-- body -->
</body>
</html>